package com.note.feng.leetcode.algorithms.easy.nine;

public class NineHundredEight {
    /**
     * 908 最小差值 I
     * 给你一个整数数组 nums，和一个整数 k 。
     *
     * 在一个操作中，您可以选择 0 <= i < nums.length 的任何索引 i 。将 nums[i] 改为 nums[i] + x ，其中 x 是一个范围为 [-k, k] 的整数。对于每个索引 i ，最多 只能 应用 一次 此操作。
     *
     * nums 的 分数 是 nums 中最大和最小元素的差值。 
     *
     * 在对  nums 中的每个索引最多应用一次上述操作后，返回 nums 的最低 分数 。
     *
     * 示例 1：
     *
     * 输入：nums = [1], k = 0
     * 输出：0
     * 解释：分数是 max(nums) - min(nums) = 1 - 1 = 0。
     * 示例 2：
     *
     * 输入：nums = [0,10], k = 2
     * 输出：6
     * 解释：将 nums 改为 [2,8]。分数是 max(nums) - min(nums) = 8 - 2 = 6。
     * 示例 3：
     *
     * 输入：nums = [1,3,6], k = 3
     * 输出：0
     * 解释：将 nums 改为 [4,4,4]。分数是 max(nums) - min(nums) = 4 - 4 = 0。
     *
     * 提示：
     *
     * 1 <= nums.length <= 104
     * 0 <= nums[i] <= 104
     * 0 <= k <= 104
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/smallest-range-i
     */
    /**
     * 解法：
     * 根据题意，对于任意一个数 nums[i] 而言，其所能变化的范围为 [nums[i] - k,
     * nums[i] + k]]，我们需要最小化变化后的差值。而当 k 足够大时，
     * 我们必然能够将所有数变为同一个值，此时答案为 0，而更一般的情况，
     * 我们能够缩减的数值距离为 2 * k，因此如果原来的最大差值为 d = max−min，
     * 若 d <= 2 * k 时，答案为 0，否则答案为 d - 2 * k
     * @param nums
     * @param k
     * @return
     */
    public int smallestRangeI(int[] nums, int k) {
        int min = nums[0], max = nums[0];
        for (int num : nums){
            min = Math.min(min, num);
            max = Math.max(max, num);
        }
        return Math.max(0, max - min - 2 * k);
    }
}
